package com.tzl.design_pattern.decorator_pattern;

/**
 * 装饰者模式:<br>
 * 是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式.<br>
 * 使用场景:<br>
 * 1. 用于扩展一个类的功能或给一个类添加附加职责.<br>
 * 2. 动态的给一个对象添加功能,这些功能可以再动态的撤销.<br>
 * 优点:<br>
 * 1. 装饰者是继承的有力补充,比继承灵活,不改变原有对象的情况下动态的给一个对象扩展功能,即插即用.<br>
 * 2. 通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果.<br>
 * 3. 装饰者完全遵守开闭原则<br>
 * 缺点:<br>
 * 1. 增加程序复杂性<br>
 * 2. 动态装饰以及多层装饰时会更加复杂.<br>
 *
 * @author Zhilei Tang
 * @date Created in 2020/11/16 20:42
 */
public class DecoratorTest {
  public static void main(String[] args) {
    Cake cake = new BaseCake();
    System.out.printf("%s,价格:%.2f\n", cake.getCakeMsg(), cake.getPrice());

    cake = new CakeAddMangoDecorator(cake);
    System.out.printf("%s,价格:%.2f\n", cake.getCakeMsg(), cake.getPrice());

    cake = new CakeAddGrapeDecorator(cake);
    System.out.printf("%s,价格:%.2f\n", cake.getCakeMsg(), cake.getPrice());
  }
}
